package controlador;

import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

import modelo.*;
import vista.*;

public class ControladorBMinas implements ActionListener {
	
	/**
	 * @uml.property  name="vistaB"
	 * @uml.associationEnd  readOnly="true"
	 */
	private VistaBMinas vistaB;
	/**
	 * @uml.property  name="modeloMina"
	 * @uml.associationEnd  readOnly="true"
	 */
	private ModeloMina modeloMina;
	

	private  String [][] elArray;

	public ControladorBMinas(VistaBMinas vistaB, String [][] elArray,ModeloMina modeloMina){
		super();
		// TODO Auto-generated constructor stub
		//vistaB = new VistaBMinas(JButton botones[][]);
		vistaB.setVisible(true);
		vistaB.addListener(this);
		
		
		//elArray =new String [modeloMina.getAncho()][modeloMina.getAlto()];
		
		cargarTablero( modeloMina,elArray, vistaB);
	    colocarBomba(modeloMina.getMina(), modeloMina);
	    comprueba( modeloMina);
	  
	    ocultaBotones( modeloMina);
	}
	
	public void accionBoton(ModeloMina modeloMina,VistaBMinas vistaB) {
		for (int i=0;i<modeloMina.getAncho();i++){
		       for (int z=0;z<modeloMina.getAlto();z++){
		        elArray[i][z]="";
		        vistaB.getBotones()[i][z].setEnabled(true);
		        vistaB.getBotones()[i][z].setText("");
		        }
		   }
		   colocarBomba(modeloMina.getMina(), modeloMina);
		   comprueba( modeloMina);
	}
	
	public void cargarTablero(ModeloMina modeloMina,String [][] elArray,VistaBMinas vistaB){ 
		for (int i=0;i<modeloMina.getAncho();i++){
			for (int z=0;z<modeloMina.getAlto();z++){
				elArray[i][z]="";
				//vistaB.getBotones()[i][z]= new JButton();
	         
				vistaB.getPanel().add(vistaB.getBotones()[i][z]);
	             
				vistaB.getBotones()[i][z].setBounds(i*25,z*25,25,25);  
				vistaB.getBotones()[i][z].setMargin(new Insets(0, 0, 0, 0));
				vistaB.getBotones()[i][z].setFont(new Font("Tahoma", 0,10));
	                    
				vistaB.getBotones()[i][z].addActionListener(
	               new ActionListener(){              
	            	   public void actionPerformed(ActionEvent ar,ModeloMina modeloMina,VistaBMinas vistaB) {
	            		   for (int i=0;i<modeloMina.getAncho();i++){  
	            			   for (int z=0;z<modeloMina.getAlto();z++){
	            				   if (ar.getSource()==vistaB.getBotones()[i][z]){
	            					   showTextTop(i,z,modeloMina);    
	            				   }
	            			   }
	            		   }
	            	   }

					@Override
					public void actionPerformed(ActionEvent arg0) {
						// TODO Auto-generated method stub
						
					}
	               });             
			}
		}
	}
	
	public void colocarBomba(int numeroBombas,ModeloMina modeloMina){
		 double i=0;
		 double z=0;
		 int condicion=0;
		 do  {  
		     i=Math.random()*modeloMina.getAncho();
		     z=Math.random()*modeloMina.getAlto();  
		     i=(int)i;
		     z=(int)z;
		     if  (z!=0 && i!=0 && z!=modeloMina.getAncho()-1 && i!=modeloMina.getAlto()-1){
		         elArray[(int)i][(int) z ]="B";
		         condicion++;
		     }
		 
		 } while (condicion<=modeloMina.getAncho());     
	}
	
	public void comprueba(ModeloMina modeloMina){ 
		for (int i=0;i<modeloMina.getAncho();i++){  
		       for (int z=0;z<modeloMina.getAlto();z++){
		       int numeroComprueba=0;
		       if (elArray[i][z]!=("B")){            
		        if  (z!=0 && i!=0 && z!=modeloMina.getAlto()-1 && i!=modeloMina.getAncho()-1){
		           System.out.println(i+ " "+ z +" "+ modeloMina.getAncho() +" "+modeloMina.getAlto());

		           if (elArray[i][z-1]=="B"){
		                  numeroComprueba++;
		           }
		           if (elArray[i-1][z-1]=="B"){
		                  numeroComprueba++;
		           }
		                 if (elArray[i+1][z-1]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (elArray[i][z+1]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (elArray[i+1][z+1]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (elArray[i-1][z+1]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (elArray[i+1][z]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (elArray[i-1][z]=="B"){
		                  numeroComprueba++;
		                 }
		                 if (numeroComprueba!=0){
		                 elArray[i][z]=(String.valueOf(numeroComprueba));
		              }          }         }                }     }
		 }
	
	public void ocultaBotones(ModeloMina modeloMina){
		   for (int i=0;i<modeloMina.getAncho();i++){  
		       for (int z=0;z<modeloMina.getAlto();z++){
		   if  (z==0 || i==0 || z==modeloMina.getAlto()-1 || i==modeloMina.getAncho()-1){
		      vistaB.getBotones()[i][z].setVisible(false);
		   }       }    }   

		}
	
	public void textoBotones(ModeloMina modeloMina){
		  for (int i=0;i<modeloMina.getAncho();i++){  
		      for (int z=0;z<modeloMina.getAlto();z++){
		       vistaB.getBotones()[i][z].setText(elArray[i][z]);
		       vistaB.getBotones()[i][z].setEnabled(false);
		  }   }   

		}
	
	
	public void showTextTop(int i,int z,ModeloMina modeloMina){
		vistaB.getBotones()[i][z].setText(elArray[i][z]);
		vistaB.getBotones()[i][z].setEnabled(false);
	  
	    if (elArray[i][z]==" "){         
	    	vistaB.getBotones()[i][z].setEnabled(false);
	    metodoStackOverFlow(i,z, modeloMina);
	    }
	    else {
	    	vistaB.getBotones()[i][z].setEnabled(false); 
	    }
	    if (vistaB.getBotones()[i][z].getText()=="B"){
	         textoBotones( modeloMina);     
	         }
	  
	 }
	
	private void metodoStackOverFlow(int i, int z,ModeloMina modeloMina) {
	    if ( z!=0 && i!=0 && z!=modeloMina.getAlto()-1 && i!=modeloMina.getAncho()-1){
	    	vistaB.getBotones()[i-1][z].setEnabled(false);  
	    	vistaB.getBotones()[i-1][z-1].setEnabled(false);
	    	vistaB.getBotones()[i-1][z+1].setEnabled(false);
	    	vistaB.getBotones()[i][z-1].setEnabled(false);
	    	vistaB.getBotones()[i][z+1].setEnabled(false);
	    	vistaB.getBotones()[i+1][z].setEnabled(false);
	    	vistaB.getBotones()[i+1][z+1].setEnabled(false);
	    	vistaB.getBotones()[i+1][z-1].setEnabled(false);
	   
	    	vistaB.getBotones()[i-1][z].setText(elArray[i-1][z]);  
	    	vistaB.getBotones()[i-1][z-1].setText(elArray[i-1][z-1]);
	    	vistaB.getBotones()[i-1][z+1].setText(elArray[i-1][z+1]);
	    	vistaB.getBotones()[i][z-1].setText(elArray[i][z-1]);
	    	vistaB.getBotones()[i][z+1].setText(elArray[i][z+1]);
	    	vistaB.getBotones()[i+1][z].setText(elArray[i+1][z]);
	    	vistaB.getBotones()[i+1][z+1].setText(elArray[i+1][z+1]);
	    	vistaB.getBotones()[i+1][z-1].setText(elArray[i+1][z-1]);
	    }
	}
	
	public void finalGame (ModeloMina modeloMina){
		   int contadorFinal=0;
		    for (int i=1;i<modeloMina.getAncho()-1;i++){  
		       for (int z=1;z<modeloMina.getAncho()-1;z++){          
		       if (vistaB.getBotones()[i][z].getText()==" " || vistaB.getBotones()[i][z].getText()=="1" ||
		    		   vistaB.getBotones()[i][z].getText()=="2" || vistaB.getBotones()[i][z].getText()=="3" ||
		    		   vistaB.getBotones()[i][z].getText()=="5" || vistaB.getBotones()[i][z].getText()=="4" ){
		            contadorFinal++;
		                 if (contadorFinal==171){
		                	 
		                 vistaB.getBtnStart().setText("NUEVO");
		                  
		                 }        }   }  }     }


	
	public void actionPerformed(ActionEvent e, ModeloMina  modeloMina) {
		// TODO Auto-generated method stub
		String actionCommand = e.getActionCommand();
		if (actionCommand.equals("START")) {
			accionBoton( modeloMina,vistaB);
		}
		cargarTablero( modeloMina, elArray, vistaB);
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}